/******************************************************************************
 * FileName:    gwin_protocol_task.h
 * Desc:        协议
 *
 *
 * Author:      Lin
 * Notes:
 *
 ******************************************************************************/

#ifndef __GWIN_PROTOCOL_H__
#define __GWIN_PROTOCOL_H__


/*-------------------------- Includes ---------------------------------------*/
#include "gwin_global_data.h"
#include "gwin_global_config.h"


/*-------------------------- Macro Definitions ------------------------------*/
// 模组类型
#define GWIN_PROT_TYPE_WIFI                             0
#define GWIN_PROT_TYPE_MESH                             1
#define GWIN_PROT_TYPE_BLE                              2

#define GWIN_PROT_TYPE                                  GWIN_PROT_TYPE_BLE      // 模组类型
#define GWIN_PROT_RX_IRQ                                ( 1 )                   // 中断接收
#define GWIN_PROT_RX_IRQ_RTOS_QUEUE                     ( 1 )                   // 中断接收 减少定时器唤醒，串口接收用实时系统消息队列分离中断处理
#define GWIN_PROT_SPEC_SECURITY                         ( 0 )                   // 米家加密


/*-------------------------- Type Declarations ------------------------------*/
/**
 * @brief 消息
 */
typedef struct
{
    uint16_t type;
    uint16_t subtype;
    union
    {
        uint32_t param;
        struct
        {
            uint8_t *data;
            uint16_t len;
            uint16_t reserve;
        };
    };
}gwin_protocol_task_msg_t;


/**
 * @brief 数据来源
 */
typedef enum
{
    PROTOCOL_TASK_DATA_WAY_NONE,
    PROTOCOL_TASK_DATA_WAY_MCU,
    PROTOCOL_TASK_DATA_WAY_REMOTE,
    PROTOCOL_TASK_DATA_WAY_LESHI_REMOTE,
    PROTOCOL_TASK_DATA_WAY_PINGTUOXIONG_REMOTE,
    PROTOCOL_TASK_DATA_WAY_SPEC_SET,
    PROTOCOL_TASK_DATA_WAY_SPEC_ACT,
}gwin_protocol_data_way_t;

/**
 * @brief 消息类型
 */
typedef enum
{
    PROTOCOL_TASK_MSG_TYPE_NONE,
    PROTOCOL_TASK_MSG_TYPE_TASK_START,
    PROTOCOL_TASK_MSG_TYPE_TIMER,
    PROTOCOL_TASK_MSG_TYPE_RECV,
    PROTOCOL_TASK_MSG_TYPE_SEND,
}gwin_protocol_task_msg_type_t;

/**
 * @brief 定时器消息子类型
 */
typedef enum
{
    PROTOCOL_TASK_MSG_TIMER_SUBTYPE_NONE,
    PROTOCOL_TASK_MSG_TIMER_SUBTYPE_UART_RX,
    PROTOCOL_TASK_MSG_TIMER_SUBTYPE_UART_TX,
    PROTOCOL_TASK_MSG_TIMER_SUBTYPE_BLE_TX,
}gwin_protocol_task_msg_timer_subtype_t;


/**
 * @brief 协议 命令
 */
typedef enum _gwin_protocol_cmd
{
    GWIN_PROT_CMD_ADV_RECV                  = 0x07,     // 广播包内容（接收）
    GWIN_PROT_CMD_ADV_RECV_LE_SHI,                      // 广播包内容（接收） --- 乐式
    GWIN_PROT_CMD_ADV_RECV_PTX,                         // 广播包内容（接收） --- 平头熊

    GWIN_PROT_CMD_SPEC                      = 0x10,     // 数据通讯
    GWIN_PROT_CMD_SPEC_STRING               = 0x13,     // 数据通讯 字符串

    GWIN_PROT_CMD_SYS_STATE                 = 0x21,     // 系统状态
    GWIN_PROT_CMD_MODEL_PID_RSQ,                        // model、pid 请求
    GWIN_PROT_CMD_LOW_PWR,                              // 低功耗

    GWIN_PROT_CMD_MODEL_PID_SET             = 0x41,     // model、pid 设置
    GWIN_PROT_CMD_NETWORK                   = 0x43,     // 网络
    GWIN_PROT_CMD_MODEL_PID_GET             = 0x44,     // model、pid 获取
    GWIN_PROT_CMD_VERIFICATION_CODE,                    // 验证码
    GWIN_PROT_CMD_ACTIVE_PAIR,                          // 激活配对

    GWIN_PROT_CMD_FW_VERSION                = 0x74,     // 固件版本
    GWIN_PROT_CMD_UTC,                                  // 时间
    GWIN_PROT_CMD_WEATHER,                              // 天气

    GWIN_PROT_CMD_QUERY                     = 0xCC,     // 查询命令

    // 研发预留用
    GWIN_PROT_CMD_RESET_ALL_FORCE           = 0xE0,     // 强制复位所有参数（研发预留接口，防止错误，直接响应）
    GWIN_PROT_CMD_BUILD_TIME,                           // 固件编译时间
    GWIN_PROT_CMD_PAIR_MODE                 = 0xEE,     // 配对模式
    GWIN_PROT_CMD_FW_NAME_TOTAL,                        // 完整固件名
}gwin_protocol_cmd_t;


/*-------------------------- Global Variables -------------------------------*/

/*-------------------------- Local Variables --------------------------------*/

/*-------------------------- Functions Declarations -------------------------*/

/*-------------------------- Functions Definitions --------------------------*/
void gwin_protocol_task_init(void);
uint8_t gwin_send_msg_to_protocol_task(gwin_protocol_task_msg_t *p_msg);

void gwin_protocol_data_recv(uint8_t way, uint8_t *data, uint16_t len);
void gwin_protocol_data_send_mcu(uint32_t type);


#endif // __GWIN_PROTOCOL_H__


/*-------------------------- END OF FILE ------------------------------------*/

